define(function(require, exports, module) {

    var languages = {
        zh_CN: require('../locale/zh_CN'),
        en_US: require('../locale/en_US')
    };

    var locale = languages[$p.language || "zh_CN"];

    /*
    SWFObject v2.2 <http://code.google.com/p/swfobject/>
    is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
    */
    var swfobject = function() {
        var D = "undefined",
            r = "object",
            S = "Shockwave Flash",
            W = "ShockwaveFlash.ShockwaveFlash",
            q = "application/x-shockwave-flash",
            R = "SWFObjectExprInst",
            x = "onreadystatechange",
            O = window,
            j = document,
            t = navigator,
            T = false,
            U = [h],
            o = [],
            N = [],
            I = [],
            l, Q, E, B, J = false,
            a = false,
            n, G, m = true,
            M = function() {
                var aa = typeof j.getElementById != D && typeof j.getElementsByTagName != D && typeof j.createElement != D,
                    ah = t.userAgent.toLowerCase(),
                    Y = t.platform.toLowerCase(),
                    ae = Y ? /win/.test(Y) : /win/.test(ah),
                    ac = Y ? /mac/.test(Y) : /mac/.test(ah),
                    af = /webkit/.test(ah) ? parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false,
                    X = !+"\v1",
                    ag = [0, 0, 0],
                    ab = null;
                if (typeof t.plugins != D && typeof t.plugins[S] == r) {
                    ab = t.plugins[S].description;
                    if (ab && !(typeof t.mimeTypes != D && t.mimeTypes[q] && !t.mimeTypes[q].enabledPlugin)) {
                        T = true;
                        X = false;
                        ab = ab.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
                        ag[0] = parseInt(ab.replace(/^(.*)\..*$/, "$1"), 10);
                        ag[1] = parseInt(ab.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
                        ag[2] = /[a-zA-Z]/.test(ab) ? parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
                    }
                } else {
                    if (typeof O.ActiveXObject != D) {
                        try {
                            var ad = new ActiveXObject(W);
                            if (ad) {
                                ab = ad.GetVariable("$version");
                                if (ab) {
                                    X = true;
                                    ab = ab.split(" ")[1].split(",");
                                    ag = [parseInt(ab[0], 10), parseInt(ab[1], 10), parseInt(ab[2], 10)];
                                }
                            }
                        } catch (Z) {}
                    }
                }
                return {
                    w3: aa,
                    pv: ag,
                    wk: af,
                    ie: X,
                    win: ae,
                    mac: ac
                };
            }(),
            k = function() {
                if (!M.w3) {
                    return;
                }
                if ((typeof j.readyState != D && j.readyState == "complete") || (typeof j.readyState == D && (j.getElementsByTagName("body")[0] || j.body))) {
                    f();
                }
                if (!J) {
                    if (typeof j.addEventListener != D) {
                        j.addEventListener("DOMContentLoaded", f, false);
                    }
                    if (M.ie && M.win) {
                        j.attachEvent(x, function() {
                            if (j.readyState == "complete") {
                                j.detachEvent(x, arguments.callee);
                                f();
                            }
                        });
                        if (O == top) {
                            (function() {
                                if (J) {
                                    return;
                                }
                                try {
                                    j.documentElement.doScroll("left");
                                } catch (X) {
                                    setTimeout(arguments.callee, 0);
                                    return;
                                }
                                f();
                            })();
                        }
                    }
                    if (M.wk) {
                        (function() {
                            if (J) {
                                return;
                            }
                            if (!/loaded|complete/.test(j.readyState)) {
                                setTimeout(arguments.callee, 0);
                                return;
                            }
                            f();
                        })();
                    }
                    s(f);
                }
            }();

        function f() {
            if (J) {
                return;
            }
            try {
                var Z = j.getElementsByTagName("body")[0].appendChild(C("span"));
                Z.parentNode.removeChild(Z);
            } catch (aa) {
                return;
            }
            J = true;
            var X = U.length;
            for (var Y = 0; Y < X; Y++) {
                U[Y]();
            }
        }

        function K(X) {
            if (J) {
                X();
            } else {
                U[U.length] = X;
            }
        }

        function s(Y) {
            if (typeof O.addEventListener != D) {
                O.addEventListener("load", Y, false);
            } else {
                if (typeof j.addEventListener != D) {
                    j.addEventListener("load", Y, false);
                } else {
                    if (typeof O.attachEvent != D) {
                        i(O, "onload", Y);
                    } else {
                        if (typeof O.onload == "function") {
                            var X = O.onload;
                            O.onload = function() {
                                X();
                                Y();
                            };
                        } else {
                            O.onload = Y;
                        }
                    }
                }
            }
        }

        function h() {
            if (T) {
                V();
            } else {
                H();
            }
        }

        function V() {
            var X = j.getElementsByTagName("body")[0];
            var aa = C(r);
            aa.setAttribute("type", q);
            var Z = X.appendChild(aa);
            if (Z) {
                var Y = 0;
                (function() {
                    if (typeof Z.GetVariable != D) {
                        var ab = Z.GetVariable("$version");
                        if (ab) {
                            ab = ab.split(" ")[1].split(",");
                            M.pv = [parseInt(ab[0], 10), parseInt(ab[1], 10), parseInt(ab[2], 10)];
                        }
                    } else {
                        if (Y < 10) {
                            Y++;
                            setTimeout(arguments.callee, 10);
                            return;
                        }
                    }
                    X.removeChild(aa);
                    Z = null;
                    H();
                })();
            } else {
                H();
            }
        }

        function H() {
            var ag = o.length;
            if (ag > 0) {
                for (var af = 0; af < ag; af++) {
                    var Y = o[af].id;
                    var ab = o[af].callbackFn;
                    var aa = {
                        success: false,
                        id: Y
                    };
                    if (M.pv[0] > 0) {
                        var ae = c(Y);
                        if (ae) {
                            if (F(o[af].swfVersion) && !(M.wk && M.wk < 312)) {
                                w(Y, true);
                                if (ab) {
                                    aa.success = true;
                                    aa.ref = z(Y);
                                    ab(aa);
                                }
                            } else {
                                if (o[af].expressInstall && A()) {
                                    var ai = {};
                                    ai.data = o[af].expressInstall;
                                    ai.width = ae.getAttribute("width") || "0";
                                    ai.height = ae.getAttribute("height") || "0";
                                    if (ae.getAttribute("class")) {
                                        ai.styleclass = ae.getAttribute("class");
                                    }
                                    if (ae.getAttribute("align")) {
                                        ai.align = ae.getAttribute("align");
                                    }
                                    var ah = {};
                                    var X = ae.getElementsByTagName("param");
                                    var ac = X.length;
                                    for (var ad = 0; ad < ac; ad++) {
                                        if (X[ad].getAttribute("name").toLowerCase() != "movie") {
                                            ah[X[ad].getAttribute("name")] = X[ad].getAttribute("value");
                                        }
                                    }
                                    P(ai, ah, Y, ab);
                                } else {
                                    p(ae);
                                    if (ab) {
                                        ab(aa);
                                    }
                                }
                            }
                        }
                    } else {
                        w(Y, true);
                        if (ab) {
                            var Z = z(Y);
                            if (Z && typeof Z.SetVariable != D) {
                                aa.success = true;
                                aa.ref = Z;
                            }
                            ab(aa);
                        }
                    }
                }
            }
        }

        function z(aa) {
            var X = null;
            var Y = c(aa);
            if (Y && Y.nodeName == "OBJECT") {
                if (typeof Y.SetVariable != D) {
                    X = Y;
                } else {
                    var Z = Y.getElementsByTagName(r)[0];
                    if (Z) {
                        X = Z;
                    }
                }
            }
            return X;
        }

        function A() {
            return !a && F("6.0.65") && (M.win || M.mac) && !(M.wk && M.wk < 312);
        }

        function P(aa, ab, X, Z) {
            a = true;
            E = Z || null;
            B = {
                success: false,
                id: X
            };
            var ae = c(X);
            if (ae) {
                if (ae.nodeName == "OBJECT") {
                    l = g(ae);
                    Q = null;
                } else {
                    l = ae;
                    Q = X;
                }
                aa.id = R;
                if (typeof aa.width == D || (!/%$/.test(aa.width) && parseInt(aa.width, 10) < 310)) {
                    aa.width = "310";
                }
                if (typeof aa.height == D || (!/%$/.test(aa.height) && parseInt(aa.height, 10) < 137)) {
                    aa.height = "137";
                }
                j.title = j.title.slice(0, 47) + " - Flash Player Installation";
                var ad = M.ie && M.win ? "ActiveX" : "PlugIn",
                    ac = "MMredirectURL=" + O.location.toString().replace(/&/g, "%26") + "&MMplayerType=" + ad + "&MMdoctitle=" + j.title;
                if (typeof ab.flashvars != D) {
                    ab.flashvars += "&" + ac;
                } else {
                    ab.flashvars = ac;
                }
                if (M.ie && M.win && ae.readyState != 4) {
                    var Y = C("div");
                    X += "SWFObjectNew";
                    Y.setAttribute("id", X);
                    ae.parentNode.insertBefore(Y, ae);
                    ae.style.display = "none";
                    (function() {
                        if (ae.readyState == 4) {
                            ae.parentNode.removeChild(ae);
                        } else {
                            setTimeout(arguments.callee, 10);
                        }
                    })();
                }
                u(aa, ab, X);
            }
        }

        function p(Y) {
            if (M.ie && M.win && Y.readyState != 4) {
                var X = C("div");
                Y.parentNode.insertBefore(X, Y);
                X.parentNode.replaceChild(g(Y), X);
                Y.style.display = "none";
                (function() {
                    if (Y.readyState == 4) {
                        Y.parentNode.removeChild(Y);
                    } else {
                        setTimeout(arguments.callee, 10);
                    }
                })();
            } else {
                Y.parentNode.replaceChild(g(Y), Y);
            }
        }

        function g(ab) {
            var aa = C("div");
            if (M.win && M.ie) {
                aa.innerHTML = ab.innerHTML;
            } else {
                var Y = ab.getElementsByTagName(r)[0];
                if (Y) {
                    var ad = Y.childNodes;
                    if (ad) {
                        var X = ad.length;
                        for (var Z = 0; Z < X; Z++) {
                            if (!(ad[Z].nodeType == 1 && ad[Z].nodeName == "PARAM") && !(ad[Z].nodeType == 8)) {
                                aa.appendChild(ad[Z].cloneNode(true));
                            }
                        }
                    }
                }
            }
            return aa;
        }

        function u(ai, ag, Y) {
            var X, aa = c(Y);
            if (M.wk && M.wk < 312) {
                return X;
            }
            if (aa) {
                if (typeof ai.id == D) {
                    ai.id = Y;
                }
                if (M.ie && M.win) {
                    var ah = "";
                    for (var ae in ai) {
                        if (ai[ae] != Object.prototype[ae]) {
                            if (ae.toLowerCase() == "data") {
                                ag.movie = ai[ae];
                            } else {
                                if (ae.toLowerCase() == "styleclass") {
                                    ah += ' class="' + ai[ae] + '"';
                                } else {
                                    if (ae.toLowerCase() != "classid") {
                                        ah += " " + ae + '="' + ai[ae] + '"';
                                    }
                                }
                            }
                        }
                    }
                    var af = "";
                    for (var ad in ag) {
                        if (ag[ad] != Object.prototype[ad]) {
                            af += '<param name="' + ad + '" value="' + ag[ad] + '" />';
                        }
                    }
                    aa.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + ah + ">" + af + "</object>";
                    N[N.length] = ai.id;
                    X = c(ai.id);
                } else {
                    var Z = C(r);
                    Z.setAttribute("type", q);
                    for (var ac in ai) {
                        if (ai[ac] != Object.prototype[ac]) {
                            if (ac.toLowerCase() == "styleclass") {
                                Z.setAttribute("class", ai[ac]);
                            } else {
                                if (ac.toLowerCase() != "classid") {
                                    Z.setAttribute(ac, ai[ac]);
                                }
                            }
                        }
                    }
                    for (var ab in ag) {
                        if (ag[ab] != Object.prototype[ab] && ab.toLowerCase() != "movie") {
                            e(Z, ab, ag[ab]);
                        }
                    }
                    aa.parentNode.replaceChild(Z, aa);
                    X = Z;
                }
            }
            return X;
        }

        function e(Z, X, Y) {
            var aa = C("param");
            aa.setAttribute("name", X);
            aa.setAttribute("value", Y);
            Z.appendChild(aa);
        }

        function y(Y) {
            var X = c(Y);
            if (X && X.nodeName == "OBJECT") {
                if (M.ie && M.win) {
                    X.style.display = "none";
                    (function() {
                        if (X.readyState == 4) {
                            b(Y);
                        } else {
                            setTimeout(arguments.callee, 10);
                        }
                    })();
                } else {
                    X.parentNode.removeChild(X);
                }
            }
        }

        function b(Z) {
            var Y = c(Z);
            if (Y) {
                for (var X in Y) {
                    if (typeof Y[X] == "function") {
                        Y[X] = null;
                    }
                }
                Y.parentNode.removeChild(Y);
            }
        }

        function c(Z) {
            var X = null;
            try {
                X = j.getElementById(Z);
            } catch (Y) {}
            return X;
        }

        function C(X) {
            return j.createElement(X);
        }

        function i(Z, X, Y) {
            Z.attachEvent(X, Y);
            I[I.length] = [Z, X, Y];
        }

        function F(Z) {
            var Y = M.pv,
                X = Z.split(".");
            X[0] = parseInt(X[0], 10);
            X[1] = parseInt(X[1], 10) || 0;
            X[2] = parseInt(X[2], 10) || 0;
            return (Y[0] > X[0] || (Y[0] == X[0] && Y[1] > X[1]) || (Y[0] == X[0] && Y[1] == X[1] && Y[2] >= X[2])) ? true : false;
        }

        function v(ac, Y, ad, ab) {
            if (M.ie && M.mac) {
                return;
            }
            var aa = j.getElementsByTagName("head")[0];
            if (!aa) {
                return;
            }
            var X = (ad && typeof ad == "string") ? ad : "screen";
            if (ab) {
                n = null;
                G = null;
            }
            if (!n || G != X) {
                var Z = C("style");
                Z.setAttribute("type", "text/css");
                Z.setAttribute("media", X);
                n = aa.appendChild(Z);
                if (M.ie && M.win && typeof j.styleSheets != D && j.styleSheets.length > 0) {
                    n = j.styleSheets[j.styleSheets.length - 1];
                }
                G = X;
            }
            if (M.ie && M.win) {
                if (n && typeof n.addRule == r) {
                    n.addRule(ac, Y);
                }
            } else {
                if (n && typeof j.createTextNode != D) {
                    n.appendChild(j.createTextNode(ac + " {" + Y + "}"));
                }
            }
        }

        function w(Z, X) {
            if (!m) {
                return;
            }
            var Y = X ? "visible" : "hidden";
            if (J && c(Z)) {
                c(Z).style.visibility = Y;
            } else {
                v("#" + Z, "visibility:" + Y);
            }
        }

        function L(Y) {
            var Z = /[\\\"<>\.;]/;
            var X = Z.exec(Y) != null;
            return X && typeof encodeURIComponent != D ? encodeURIComponent(Y) : Y;
        }
        var d = function() {
            if (M.ie && M.win) {
                window.attachEvent("onunload", function() {
                    var ac = I.length;
                    for (var ab = 0; ab < ac; ab++) {
                        I[ab][0].detachEvent(I[ab][1], I[ab][2]);
                    }
                    var Z = N.length;
                    for (var aa = 0; aa < Z; aa++) {
                        y(N[aa]);
                    }
                    for (var Y in M) {
                        M[Y] = null;
                    }
                    M = null;
                    for (var X in swfobject) {
                        swfobject[X] = null;
                    }
                    swfobject = null;
                });
            }
        }();
        return {
            registerObject: function(ab, X, aa, Z) {
                if (M.w3 && ab && X) {
                    var Y = {};
                    Y.id = ab;
                    Y.swfVersion = X;
                    Y.expressInstall = aa;
                    Y.callbackFn = Z;
                    o[o.length] = Y;
                    w(ab, false);
                } else {
                    if (Z) {
                        Z({
                            success: false,
                            id: ab
                        });
                    }
                }
            },
            getObjectById: function(X) {
                if (M.w3) {
                    return z(X);
                }
            },
            embedSWF: function(ab, ah, ae, ag, Y, aa, Z, ad, af, ac) {
                var X = {
                    success: false,
                    id: ah
                };
                if (M.w3 && !(M.wk && M.wk < 312) && ab && ah && ae && ag && Y) {
                    w(ah, false);
                    K(function() {
                        ae += "";
                        ag += "";
                        var aj = {};
                        if (af && typeof af === r) {
                            for (var al in af) {
                                aj[al] = af[al];
                            }
                        }
                        aj.data = ab;
                        aj.width = ae;
                        aj.height = ag;
                        var am = {};
                        if (ad && typeof ad === r) {
                            for (var ak in ad) {
                                am[ak] = ad[ak];
                            }
                        }
                        if (Z && typeof Z === r) {
                            for (var ai in Z) {
                                if (typeof am.flashvars != D) {
                                    am.flashvars += "&" + ai + "=" + Z[ai];
                                } else {
                                    am.flashvars = ai + "=" + Z[ai];
                                }
                            }
                        }
                        if (F(Y)) {
                            var an = u(aj, am, ah);
                            if (aj.id == ah) {
                                w(ah, true);
                            }
                            X.success = true;
                            X.ref = an;
                        } else {
                            if (aa && A()) {
                                aj.data = aa;
                                P(aj, am, ah, ac);
                                return;
                            } else {
                                w(ah, true);
                            }
                        }
                        if (ac) {
                            ac(X);
                        }
                    });
                } else {
                    if (ac) {
                        ac(X);
                    }
                }
            },
            switchOffAutoHideShow: function() {
                m = false;
            },
            ua: M,
            getFlashPlayerVersion: function() {
                return {
                    major: M.pv[0],
                    minor: M.pv[1],
                    release: M.pv[2]
                };
            },
            hasFlashPlayerVersion: F,
            createSWF: function(Z, Y, X) {
                if (M.w3) {
                    return u(Z, Y, X);
                } else {
                    return undefined;
                }
            },
            showExpressInstall: function(Z, aa, X, Y) {
                if (M.w3 && A()) {
                    P(Z, aa, X, Y);
                }
            },
            removeSWF: function(X) {
                if (M.w3) {
                    y(X);
                }
            },
            createCSS: function(aa, Z, Y, X) {
                if (M.w3) {
                    v(aa, Z, Y, X);
                }
            },
            addDomLoadEvent: K,
            addLoadEvent: s,
            getQueryParamValue: function(aa) {
                var Z = j.location.search || j.location.hash;
                if (Z) {
                    if (/\?/.test(Z)) {
                        Z = Z.split("?")[1];
                    }
                    if (aa == null) {
                        return L(Z);
                    }
                    var Y = Z.split("&");
                    for (var X = 0; X < Y.length; X++) {
                        if (Y[X].substring(0, Y[X].indexOf("=")) == aa) {
                            return L(Y[X].substring((Y[X].indexOf("=") + 1)));
                        }
                    }
                }
                return "";
            },
            expressInstallCallback: function() {
                if (a) {
                    var X = c(R);
                    if (X && l) {
                        X.parentNode.replaceChild(l, X);
                        if (Q) {
                            w(Q, true);
                            if (M.ie && M.win) {
                                l.style.display = "block";
                            }
                        }
                        if (E) {
                            E(B);
                        }
                    }
                    a = false;
                }
            }
        };
    }();

    /*
    SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com

    mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/,  http://www.vinterwebb.se/

    SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilzén and Mammon Media and is released under the MIT License:
    http://www.opensource.org/licenses/mit-license.php

    SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:
    http://www.opensource.org/licenses/mit-license.php
    */

    var SWFUpload;
    if (SWFUpload == undefined) {
        SWFUpload = function(a) {
            this.initSWFUpload(a)
        }
    }
    SWFUpload.prototype.initSWFUpload = function(b) {
        try {
            this.customSettings = {};
            this.settings = b;
            this.eventQueue = [];
            this.movieName = "SWFUpload_" + SWFUpload.movieCount++;
            this.movieElement = null;
            SWFUpload.instances[this.movieName] = this;
            this.initSettings();
            this.loadFlash();
            this.displayDebugInfo()
        } catch (a) {
            delete SWFUpload.instances[this.movieName];
            throw a
        }
    };
    SWFUpload.instances = {};
    SWFUpload.movieCount = 0;
    SWFUpload.version = "2.2.0 2009-03-25";
    SWFUpload.QUEUE_ERROR = {
        QUEUE_LIMIT_EXCEEDED: -100,
        FILE_EXCEEDS_SIZE_LIMIT: -110,
        ZERO_BYTE_FILE: -120,
        INVALID_FILETYPE: -130
    };
    SWFUpload.UPLOAD_ERROR = {
        HTTP_ERROR: -200,
        MISSING_UPLOAD_URL: -210,
        IO_ERROR: -220,
        SECURITY_ERROR: -230,
        UPLOAD_LIMIT_EXCEEDED: -240,
        UPLOAD_FAILED: -250,
        SPECIFIED_FILE_ID_NOT_FOUND: -260,
        FILE_VALIDATION_FAILED: -270,
        FILE_CANCELLED: -280,
        UPLOAD_STOPPED: -290
    };
    SWFUpload.FILE_STATUS = {
        QUEUED: -1,
        IN_PROGRESS: -2,
        ERROR: -3,
        COMPLETE: -4,
        CANCELLED: -5
    };
    SWFUpload.BUTTON_ACTION = {
        SELECT_FILE: -100,
        SELECT_FILES: -110,
        START_UPLOAD: -120
    };
    SWFUpload.CURSOR = {
        ARROW: -1,
        HAND: -2
    };
    SWFUpload.WINDOW_MODE = {
        WINDOW: "window",
        TRANSPARENT: "transparent",
        OPAQUE: "opaque"
    };
    SWFUpload.completeURL = function(a) {
        if (typeof(a) !== "string" || a.match(/^https?:\/\//i) || a.match(/^\//)) {
            return a
        }
        var c = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":" + window.location.port : "");
        var b = window.location.pathname.lastIndexOf("/");
        if (b <= 0) {
            path = "/"
        } else {
            path = window.location.pathname.substr(0, b) + "/"
        }
        return path + a
    };
    SWFUpload.prototype.initSettings = function() {
        this.ensureDefault = function(b, a) {
            this.settings[b] = (this.settings[b] == undefined) ? a : this.settings[b]
        };
        this.ensureDefault("upload_url", "");
        this.ensureDefault("preserve_relative_urls", false);
        this.ensureDefault("file_post_name", "Filedata");
        this.ensureDefault("post_params", {});
        this.ensureDefault("use_query_string", false);
        this.ensureDefault("requeue_on_error", false);
        this.ensureDefault("http_success", []);
        this.ensureDefault("assume_success_timeout", 0);
        this.ensureDefault("file_types", "*.*");
        this.ensureDefault("file_types_description", "All Files");
        this.ensureDefault("file_size_limit", 0);
        this.ensureDefault("file_upload_limit", 0);
        this.ensureDefault("file_queue_limit", 0);
        this.ensureDefault("flash_url", "swfupload.swf");
        this.ensureDefault("prevent_swf_caching", true);
        this.ensureDefault("button_image_url", "");
        this.ensureDefault("button_width", 1);
        this.ensureDefault("button_height", 1);
        this.ensureDefault("button_text", "");
        this.ensureDefault("button_text_style", "color: #000000; font-size: 16pt;");
        this.ensureDefault("button_text_top_padding", 0);
        this.ensureDefault("button_text_left_padding", 0);
        this.ensureDefault("button_action", SWFUpload.BUTTON_ACTION.SELECT_FILES);
        this.ensureDefault("button_disabled", false);
        this.ensureDefault("button_placeholder_id", "");
        this.ensureDefault("button_placeholder", null);
        this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW);
        this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW);
        this.ensureDefault("debug", false);
        this.settings.debug_enabled = this.settings.debug;
        this.settings.return_upload_start_handler = this.returnUploadStart;
        this.ensureDefault("swfupload_loaded_handler", null);
        this.ensureDefault("file_dialog_start_handler", null);
        this.ensureDefault("file_queued_handler", null);
        this.ensureDefault("file_queue_error_handler", null);
        this.ensureDefault("file_dialog_complete_handler", null);
        this.ensureDefault("upload_start_handler", null);
        this.ensureDefault("upload_progress_handler", null);
        this.ensureDefault("upload_error_handler", null);
        this.ensureDefault("upload_success_handler", null);
        this.ensureDefault("upload_complete_handler", null);
        this.ensureDefault("debug_handler", this.debugMessage);
        this.ensureDefault("custom_settings", {});
        this.customSettings = this.settings.custom_settings;
        if (!!this.settings.prevent_swf_caching) {
            this.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime()
        }
        if (!this.settings.preserve_relative_urls) {
            this.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url);
            if (this.settings.button_image_url != "") {
                this.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url)
            }

        }
        delete this.ensureDefault
    };
    SWFUpload.prototype.loadFlash = function() {
        var a, b;
        if (document.getElementById(this.movieName) !== null) {
            throw "ID " + this.movieName + " is already in use. The Flash Object could not be added"
        }
        a = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder;
        if (a == undefined) {
            throw "Could not find the placeholder element: " + this.settings.button_placeholder_id
        }
        b = document.createElement("div");
        b.innerHTML = this.getFlashHTML();
        a.parentNode.replaceChild(b.firstChild, a);
        if (window[this.movieName] == undefined) {
            window[this.movieName] = this.getMovieElement()
        }
    };
    SWFUpload.prototype.getFlashHTML = function() {
        return ['<object id="', this.movieName, '" type="application/x-shockwave-flash" data="', this.settings.flash_url, '" width="', this.settings.button_width, '" height="', this.settings.button_height, '" class="swfupload">', '<param name="wmode" value="', this.settings.button_window_mode, '" />', '<param name="movie" value="', this.settings.flash_url, '" />', '<param name="quality" value="high" />', '<param name="menu" value="false" />', '<param name="allowScriptAccess" value="always" />', '<param name="flashvars" value="' + this.getFlashVars() + '" />', "</object>"].join("")
    };
    SWFUpload.prototype.getFlashVars = function() {
        var b = this.buildParamString();
        var a = this.settings.http_success.join(",");
        return ["movieName=", encodeURIComponent(this.movieName), "&amp;uploadURL=", encodeURIComponent(this.settings.upload_url), "&amp;useQueryString=", encodeURIComponent(this.settings.use_query_string), "&amp;requeueOnError=", encodeURIComponent(this.settings.requeue_on_error), "&amp;httpSuccess=", encodeURIComponent(a), "&amp;assumeSuccessTimeout=", encodeURIComponent(this.settings.assume_success_timeout), "&amp;params=", encodeURIComponent(b), "&amp;filePostName=", encodeURIComponent(this.settings.file_post_name), "&amp;fileTypes=", encodeURIComponent(this.settings.file_types), "&amp;fileTypesDescription=", encodeURIComponent(this.settings.file_types_description), "&amp;fileSizeLimit=", encodeURIComponent(this.settings.file_size_limit), "&amp;fileUploadLimit=", encodeURIComponent(this.settings.file_upload_limit), "&amp;fileQueueLimit=", encodeURIComponent(this.settings.file_queue_limit), "&amp;debugEnabled=", encodeURIComponent(this.settings.debug_enabled), "&amp;buttonImageURL=", encodeURIComponent(this.settings.button_image_url), "&amp;buttonWidth=", encodeURIComponent(this.settings.button_width), "&amp;buttonHeight=", encodeURIComponent(this.settings.button_height), "&amp;buttonText=", encodeURIComponent(this.settings.button_text), "&amp;buttonTextTopPadding=", encodeURIComponent(this.settings.button_text_top_padding), "&amp;buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding), "&amp;buttonTextStyle=", encodeURIComponent(this.settings.button_text_style), "&amp;buttonAction=", encodeURIComponent(this.settings.button_action), "&amp;buttonDisabled=", encodeURIComponent(this.settings.button_disabled), "&amp;buttonCursor=", encodeURIComponent(this.settings.button_cursor)].join("")
    };
    SWFUpload.prototype.getMovieElement = function() {
        if (this.movieElement == undefined) {
            this.movieElement = document.getElementById(this.movieName)
        }
        if (this.movieElement === null) {
            throw "Could not find Flash element"
        }
        return this.movieElement
    };
    SWFUpload.prototype.buildParamString = function() {
        var c = this.settings.post_params;
        var b = [];
        if (typeof(c) === "object") {
            for (var a in c) {
                if (c.hasOwnProperty(a)) {
                    b.push(encodeURIComponent(a.toString()) + "=" + encodeURIComponent(c[a].toString()))
                }
            }
        }
        return b.join("&amp;")
    };
    SWFUpload.prototype.destroy = function() {
        try {
            this.cancelUpload(null, false);
            var a = null;
            a = this.getMovieElement();
            if (a && typeof(a.CallFunction) === "unknown") {
                for (var c in a) {
                    try {
                        if (typeof(a[c]) === "function") {
                            a[c] = null
                        }
                    } catch (e) {}
                }
                try {
                    a.parentNode.removeChild(a)
                } catch (b) {}
            }
            window[this.movieName] = null;
            SWFUpload.instances[this.movieName] = null;
            delete SWFUpload.instances[this.movieName];
            this.movieElement = null;
            this.settings = null;
            this.customSettings = null;
            this.eventQueue = null;
            this.movieName = null;
            return true
        } catch (d) {
            return false
        }
    };
    SWFUpload.prototype.displayDebugInfo = function() {
        this.debug(["---SWFUpload Instance Info---\n", "Version: ", SWFUpload.version, "\n", "Movie Name: ", this.movieName, "\n", "Settings:\n", "\t", "upload_url:               ", this.settings.upload_url, "\n", "\t", "flash_url:                ", this.settings.flash_url, "\n", "\t", "use_query_string:         ", this.settings.use_query_string.toString(), "\n", "\t", "requeue_on_error:         ", this.settings.requeue_on_error.toString(), "\n", "\t", "http_success:             ", this.settings.http_success.join(", "), "\n", "\t", "assume_success_timeout:   ", this.settings.assume_success_timeout, "\n", "\t", "file_post_name:           ", this.settings.file_post_name, "\n", "\t", "post_params:              ", this.settings.post_params.toString(), "\n", "\t", "file_types:               ", this.settings.file_types, "\n", "\t", "file_types_description:   ", this.settings.file_types_description, "\n", "\t", "file_size_limit:          ", this.settings.file_size_limit, "\n", "\t", "file_upload_limit:        ", this.settings.file_upload_limit, "\n", "\t", "file_queue_limit:         ", this.settings.file_queue_limit, "\n", "\t", "debug:                    ", this.settings.debug.toString(), "\n", "\t", "prevent_swf_caching:      ", this.settings.prevent_swf_caching.toString(), "\n", "\t", "button_placeholder_id:    ", this.settings.button_placeholder_id.toString(), "\n", "\t", "button_placeholder:       ", (this.settings.button_placeholder ? "Set" : "Not Set"), "\n", "\t", "button_image_url:         ", this.settings.button_image_url.toString(), "\n", "\t", "button_width:             ", this.settings.button_width.toString(), "\n", "\t", "button_height:            ", this.settings.button_height.toString(), "\n", "\t", "button_text:              ", this.settings.button_text.toString(), "\n", "\t", "button_text_style:        ", this.settings.button_text_style.toString(), "\n", "\t", "button_text_top_padding:  ", this.settings.button_text_top_padding.toString(), "\n", "\t", "button_text_left_padding: ", this.settings.button_text_left_padding.toString(), "\n", "\t", "button_action:            ", this.settings.button_action.toString(), "\n", "\t", "button_disabled:          ", this.settings.button_disabled.toString(), "\n", "\t", "custom_settings:          ", this.settings.custom_settings.toString(), "\n", "Event Handlers:\n", "\t", "swfupload_loaded_handler assigned:  ", (typeof this.settings.swfupload_loaded_handler === "function").toString(), "\n", "\t", "file_dialog_start_handler assigned: ", (typeof this.settings.file_dialog_start_handler === "function").toString(), "\n", "\t", "file_queued_handler assigned:       ", (typeof this.settings.file_queued_handler === "function").toString(), "\n", "\t", "file_queue_error_handler assigned:  ", (typeof this.settings.file_queue_error_handler === "function").toString(), "\n", "\t", "upload_start_handler assigned:      ", (typeof this.settings.upload_start_handler === "function").toString(), "\n", "\t", "upload_progress_handler assigned:   ", (typeof this.settings.upload_progress_handler === "function").toString(), "\n", "\t", "upload_error_handler assigned:      ", (typeof this.settings.upload_error_handler === "function").toString(), "\n", "\t", "upload_success_handler assigned:    ", (typeof this.settings.upload_success_handler === "function").toString(), "\n", "\t", "upload_complete_handler assigned:   ", (typeof this.settings.upload_complete_handler === "function").toString(), "\n", "\t", "debug_handler assigned:             ", (typeof this.settings.debug_handler === "function").toString(), "\n"].join(""))
    };
    SWFUpload.prototype.addSetting = function(b, c, a) {
        if (c == undefined) {
            return (this.settings[b] = a)
        } else {
            return (this.settings[b] = c)
        }
    };
    SWFUpload.prototype.getSetting = function(a) {
        if (this.settings[a] != undefined) {
            return this.settings[a]
        }
        return ""
    };
    SWFUpload.prototype.callFlash = function(functionName, argumentArray) {
        argumentArray = argumentArray || [];
        var movieElement = this.getMovieElement();
        var returnValue, returnString;
        try {
            returnString = movieElement.CallFunction('<invoke name="' + functionName + '" returntype="javascript">' + __flash__argumentsToXML(argumentArray, 0) + "</invoke>");
            returnValue = eval(returnString)
        } catch (ex) {
            throw "Call to " + functionName + " failed"
        }
        if (returnValue != undefined && typeof returnValue.post === "object") {
            returnValue = this.unescapeFilePostParams(returnValue)
        }
        return returnValue
    };
    SWFUpload.prototype.selectFile = function() {
        this.callFlash("SelectFile")
    };
    SWFUpload.prototype.selectFiles = function() {
        this.callFlash("SelectFiles")
    };
    SWFUpload.prototype.startUpload = function(a) {
        this.callFlash("StartUpload", [a])
    };
    SWFUpload.prototype.cancelUpload = function(a, b) {
        if (b !== false) {
            b = true
        }
        this.callFlash("CancelUpload", [a, b])
    };
    SWFUpload.prototype.stopUpload = function() {
        this.callFlash("StopUpload")
    };
    SWFUpload.prototype.getStats = function() {
        return this.callFlash("GetStats")
    };
    SWFUpload.prototype.setStats = function(a) {
        this.callFlash("SetStats", [a])
    };
    SWFUpload.prototype.getFile = function(a) {
        if (typeof(a) === "number") {
            return this.callFlash("GetFileByIndex", [a])
        } else {
            return this.callFlash("GetFile", [a])
        }
    };
    SWFUpload.prototype.addFileParam = function(a, b, c) {
        return this.callFlash("AddFileParam", [a, b, c])
    };
    SWFUpload.prototype.removeFileParam = function(a, b) {
        this.callFlash("RemoveFileParam", [a, b])
    };
    SWFUpload.prototype.setUploadURL = function(a) {
        this.settings.upload_url = a.toString();
        this.callFlash("SetUploadURL", [a])
    };
    SWFUpload.prototype.setPostParams = function(a) {
        this.settings.post_params = a;
        this.callFlash("SetPostParams", [a])
    };
    SWFUpload.prototype.addPostParam = function(a, b) {
        this.settings.post_params[a] = b;
        this.callFlash("SetPostParams", [this.settings.post_params])
    };
    SWFUpload.prototype.removePostParam = function(a) {
        delete this.settings.post_params[a];
        this.callFlash("SetPostParams", [this.settings.post_params])
    };
    SWFUpload.prototype.setFileTypes = function(a, b) {
        this.settings.file_types = a;
        this.settings.file_types_description = b;
        this.callFlash("SetFileTypes", [a, b])
    };
    SWFUpload.prototype.setFileSizeLimit = function(a) {
        this.settings.file_size_limit = a;
        this.callFlash("SetFileSizeLimit", [a])
    };
    SWFUpload.prototype.setFileUploadLimit = function(a) {
        this.settings.file_upload_limit = a;
        this.callFlash("SetFileUploadLimit", [a])
    };
    SWFUpload.prototype.setFileQueueLimit = function(a) {
        this.settings.file_queue_limit = a;
        this.callFlash("SetFileQueueLimit", [a])
    };
    SWFUpload.prototype.setFilePostName = function(a) {
        this.settings.file_post_name = a;
        this.callFlash("SetFilePostName", [a])
    };
    SWFUpload.prototype.setUseQueryString = function(a) {
        this.settings.use_query_string = a;
        this.callFlash("SetUseQueryString", [a])
    };
    SWFUpload.prototype.setRequeueOnError = function(a) {
        this.settings.requeue_on_error = a;
        this.callFlash("SetRequeueOnError", [a])
    };
    SWFUpload.prototype.setHTTPSuccess = function(a) {
        if (typeof a === "string") {
            a = a.replace(" ", "").split(",")
        }
        this.settings.http_success = a;
        this.callFlash("SetHTTPSuccess", [a])
    };
    SWFUpload.prototype.setAssumeSuccessTimeout = function(a) {
        this.settings.assume_success_timeout = a;
        this.callFlash("SetAssumeSuccessTimeout", [a])
    };
    SWFUpload.prototype.setDebugEnabled = function(a) {
        this.settings.debug_enabled = a;
        this.callFlash("SetDebugEnabled", [a])
    };
    SWFUpload.prototype.setButtonImageURL = function(a) {
        if (a == undefined) {
            a = ""
        }
        this.settings.button_image_url = a;
        this.callFlash("SetButtonImageURL", [a])
    };
    SWFUpload.prototype.setButtonDimensions = function(c, a) {
        this.settings.button_width = c;
        this.settings.button_height = a;
        var b = this.getMovieElement();
        if (b != undefined) {
            b.style.width = c + "px";
            b.style.height = a + "px"
        }
        this.callFlash("SetButtonDimensions", [c, a])
    };
    SWFUpload.prototype.setButtonText = function(a) {
        this.settings.button_text = a;
        this.callFlash("SetButtonText", [a])
    };
    SWFUpload.prototype.setButtonTextPadding = function(b, a) {
        this.settings.button_text_top_padding = a;
        this.settings.button_text_left_padding = b;
        this.callFlash("SetButtonTextPadding", [b, a])
    };
    SWFUpload.prototype.setButtonTextStyle = function(a) {
        this.settings.button_text_style = a;
        this.callFlash("SetButtonTextStyle", [a])
    };
    SWFUpload.prototype.setButtonDisabled = function(a) {
        this.settings.button_disabled = a;
        this.callFlash("SetButtonDisabled", [a])
    };
    SWFUpload.prototype.setButtonAction = function(a) {
        this.settings.button_action = a;
        this.callFlash("SetButtonAction", [a])
    };
    SWFUpload.prototype.setButtonCursor = function(a) {
        this.settings.button_cursor = a;
        this.callFlash("SetButtonCursor", [a])
    };
    SWFUpload.prototype.queueEvent = function(b, c) {
        if (c == undefined) {
            c = []
        } else {
            if (!(c instanceof Array)) {
                c = [c]
            }
        }
        var a = this;
        if (typeof this.settings[b] === "function") {
            this.eventQueue.push(function() {
                this.settings[b].apply(this, c)
            });
            setTimeout(function() {
                a.executeNextEvent()
            }, 0)
        } else {
            if (this.settings[b] !== null) {
                throw "Event handler " + b + " is unknown or is not a function"
            }
        }
    };
    SWFUpload.prototype.executeNextEvent = function() {
        var a = this.eventQueue ? this.eventQueue.shift() : null;
        if (typeof(a) === "function") {
            a.apply(this)
        }
    };
    SWFUpload.prototype.unescapeFilePostParams = function(c) {
        var e = /[$]([0-9a-f]{4})/i;
        var f = {};
        var d;
        if (c != undefined) {
            for (var a in c.post) {
                if (c.post.hasOwnProperty(a)) {
                    d = a;
                    var b;
                    while ((b = e.exec(d)) !== null) {
                        d = d.replace(b[0], String.fromCharCode(parseInt("0x" + b[1], 16)))
                    }
                    f[d] = c.post[a]
                }
            }
            c.post = f
        }
        return c
    };
    SWFUpload.prototype.testExternalInterface = function() {
        try {
            return this.callFlash("TestExternalInterface")
        } catch (a) {
            return false
        }
    };
    SWFUpload.prototype.flashReady = function() {
        var a = this.getMovieElement();
        if (!a) {
            this.debug("Flash called back ready but the flash movie can't be found.");
            return
        }
        this.cleanUp(a);
        this.queueEvent("swfupload_loaded_handler")
    };
    SWFUpload.prototype.cleanUp = function(a) {
        try {
            if (this.movieElement && typeof(a.CallFunction) === "unknown") {
                this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");
                for (var c in a) {
                    try {
                        if (typeof(a[c]) === "function") {
                            a[c] = null
                        }
                    } catch (b) {}
                }
            }
        } catch (d) {}
        window.__flash__removeCallback = function(e, f) {
            try {
                if (e) {
                    e[f] = null
                }
            } catch (g) {}
        }
    };
    SWFUpload.prototype.fileDialogStart = function() {
        this.queueEvent("file_dialog_start_handler")
    };
    SWFUpload.prototype.fileQueued = function(a) {
        a = this.unescapeFilePostParams(a);
        this.queueEvent("file_queued_handler", a)
    };
    SWFUpload.prototype.fileQueueError = function(a, c, b) {
        a = this.unescapeFilePostParams(a);
        this.queueEvent("file_queue_error_handler", [a, c, b])
    };
    SWFUpload.prototype.fileDialogComplete = function(b, c, a) {
        this.queueEvent("file_dialog_complete_handler", [b, c, a])
    };
    SWFUpload.prototype.uploadStart = function(a) {
        a = this.unescapeFilePostParams(a);
        this.queueEvent("return_upload_start_handler", a)
    };
    SWFUpload.prototype.returnUploadStart = function(a) {
        var b;
        if (typeof this.settings.upload_start_handler === "function") {
            a = this.unescapeFilePostParams(a);
            b = this.settings.upload_start_handler.call(this, a)
        } else {
            if (this.settings.upload_start_handler != undefined) {
                throw "upload_start_handler must be a function"
            }
        }
        if (b === undefined) {
            b = true
        }
        b = !!b;
        this.callFlash("ReturnUploadStart", [b])
    };
    SWFUpload.prototype.uploadProgress = function(a, c, b) {
        a = this.unescapeFilePostParams(a);
        this.queueEvent("upload_progress_handler", [a, c, b])
    };
    SWFUpload.prototype.uploadError = function(a, c, b) {
        a = this.unescapeFilePostParams(a);
        this.queueEvent("upload_error_handler", [a, c, b])
    };
    SWFUpload.prototype.uploadSuccess = function(b, a, c) {
        b = this.unescapeFilePostParams(b);
        this.queueEvent("upload_success_handler", [b, a, c])
    };
    SWFUpload.prototype.uploadComplete = function(a) {
        a = this.unescapeFilePostParams(a);
        this.queueEvent("upload_complete_handler", a)
    };
    SWFUpload.prototype.debug = function(a) {
        this.queueEvent("debug_handler", a)
    };
    SWFUpload.prototype.debugMessage = function(c) {
        if (this.settings.debug) {
            var a, d = [];
            if (typeof c === "object" && typeof c.name === "string" && typeof c.message === "string") {
                for (var b in c) {
                    if (c.hasOwnProperty(b)) {
                        d.push(b + ": " + c[b])
                    }
                }
                a = d.join("\n") || "";
                d = a.split("\n");
                a = "EXCEPTION: " + d.join("\nEXCEPTION: ");
                SWFUpload.Console.writeLine(a)
            } else {
                SWFUpload.Console.writeLine(c)
            }
        }
    };
    SWFUpload.Console = {};
    SWFUpload.Console.writeLine = function(d) {
        var b, a;
        try {
            b = document.getElementById("SWFUpload_Console");
            if (!b) {
                a = document.createElement("form");
                document.getElementsByTagName("body")[0].appendChild(a);
                b = document.createElement("textarea");
                b.id = "SWFUpload_Console";
                b.style.fontFamily = "monospace";
                b.setAttribute("wrap", "off");
                b.wrap = "off";
                b.style.overflow = "auto";
                b.style.width = "700px";
                b.style.height = "350px";
                b.style.margin = "5px";
                a.appendChild(b)
            }
            b.value += d + "\n";
            b.scrollTop = b.scrollHeight - b.clientHeight
        } catch (c) {
            alert("Exception: " + c.name + " Message: " + c.message)
        }
    };

    /*
    Uploadify v3.2.1
    Copyright (c) 2012 Reactive Apps, Ronnie Garcia
    Released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
    */

    (function($) {

        // These methods can be called by adding them as the first argument in the uploadify plugin call
        var methods = {

            init: function(options, swfUploadOptions) {

                return this.each(function() {

                    // Create a reference to the jQuery DOM object
                    var $this = $(this);

                    // Clone the original DOM object
                    var $clone = $this.clone();

                    // Setup the default options
                    var settings = $.extend({
                        // Required Settings
                        id: $this.attr('id'), // The ID of the DOM object
                        swf: 'uploadify.swf', // The path to the uploadify SWF file
                        uploader: 'uploadify.php', // The path to the server-side upload script

                        // Options
                        auto: true, // Automatically upload files when added to the queue
                        buttonClass: '', // A class name to add to the browse button DOM object
                        buttonCursor: 'hand', // The cursor to use with the browse button
                        buttonImage: null, // (String or null) The path to an image to use for the Flash browse button if not using CSS to style the button
                        buttonText: 'SELECT FILES', // The text to use for the browse button
                        checkExisting: false, // The path to a server-side script that checks for existing files on the server
                        debug: false, // Turn on swfUpload debugging mode
                        fileObjName: 'Filedata', // The name of the file object to use in your server-side script
                        fileSizeLimit: 0, // The maximum size of an uploadable file in KB (Accepts units B KB MB GB if string, 0 for no limit)
                        fileTypeDesc: 'All Files', // The description for file types in the browse dialog
                        fileTypeExts: '*.*', // Allowed extensions in the browse dialog (server-side validation should also be used)
                        height: 30, // The height of the browse button
                        itemTemplate: false, // The template for the file item in the queue
                        method: 'post', // The method to use when sending files to the server-side upload script
                        multi: true, // Allow multiple file selection in the browse dialog
                        formData: {}, // An object with additional data to send to the server-side upload script with every file upload
                        preventCaching: true, // Adds a random value to the Flash URL to prevent caching of it (conflicts with existing parameters)
                        progressData: 'percentage', // ('percentage' or 'speed') Data to show in the queue item during a file upload
                        queueID: false, // The ID of the DOM object to use as a file queue (without the #)
                        queueSizeLimit: 999, // The maximum number of files that can be in the queue at one time
                        removeCompleted: true, // Remove queue items from the queue when they are done uploading
                        removeTimeout: 3, // The delay in seconds before removing a queue item if removeCompleted is set to true
                        requeueErrors: false, // Keep errored files in the queue and keep trying to upload them
                        successTimeout: 30, // The number of seconds to wait for Flash to detect the server's response after the file has finished uploading
                        uploadLimit: 0, // The maximum number of files you can upload
                        width: 120, // The width of the browse button

                        // Events
                        overrideEvents: [] // (Array) A list of default event handlers to skip
                            /*
                            onCancel         // Triggered when a file is cancelled from the queue
                            onClearQueue     // Triggered during the 'clear queue' method
                            onDestroy        // Triggered when the uploadify object is destroyed
                            onDialogClose    // Triggered when the browse dialog is closed
                            onDialogOpen     // Triggered when the browse dialog is opened
                            onDisable        // Triggered when the browse button gets disabled
                            onEnable         // Triggered when the browse button gets enabled
                            onFallback       // Triggered is Flash is not detected
                            onInit           // Triggered when Uploadify is initialized
                            onQueueComplete  // Triggered when all files in the queue have been uploaded
                            onSelectError    // Triggered when an error occurs while selecting a file (file size, queue size limit, etc.)
                            onSelect         // Triggered for each file that is selected
                            onSWFReady       // Triggered when the SWF button is loaded
                            onUploadComplete // Triggered when a file upload completes (success or error)
                            onUploadError    // Triggered when a file upload returns an error
                            onUploadSuccess  // Triggered when a file is uploaded successfully
                            onUploadProgress // Triggered every time a file progress is updated
                            onUploadStart    // Triggered immediately before a file upload starts
                            */
                    }, options);

                    // Prepare settings for SWFUpload
                    var swfUploadSettings = {
                        assume_success_timeout: settings.successTimeout,
                        button_placeholder_id: settings.id,
                        button_width: settings.width,
                        button_height: settings.height,
                        button_text: null,
                        button_text_style: null,
                        button_text_top_padding: 0,
                        button_text_left_padding: 0,
                        button_action: (settings.multi ? SWFUpload.BUTTON_ACTION.SELECT_FILES : SWFUpload.BUTTON_ACTION.SELECT_FILE),
                        button_disabled: false,
                        button_cursor: (settings.buttonCursor == 'arrow' ? SWFUpload.CURSOR.ARROW : SWFUpload.CURSOR.HAND),
                        button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
                        debug: settings.debug,
                        requeue_on_error: settings.requeueErrors,
                        file_post_name: settings.fileObjName,
                        file_size_limit: settings.fileSizeLimit,
                        file_types: settings.fileTypeExts,
                        file_types_description: settings.fileTypeDesc,
                        file_queue_limit: settings.queueSizeLimit,
                        file_upload_limit: settings.uploadLimit,
                        flash_url: settings.swf,
                        prevent_swf_caching: settings.preventCaching,
                        post_params: settings.formData,
                        upload_url: settings.uploader,
                        use_query_string: (settings.method == 'get'),

                        // Event Handlers
                        file_dialog_complete_handler: handlers.onDialogClose,
                        file_dialog_start_handler: handlers.onDialogOpen,
                        file_queued_handler: handlers.onSelect,
                        file_queue_error_handler: handlers.onSelectError,
                        swfupload_loaded_handler: settings.onSWFReady,
                        upload_complete_handler: handlers.onUploadComplete,
                        upload_error_handler: handlers.onUploadError,
                        upload_progress_handler: handlers.onUploadProgress,
                        upload_start_handler: handlers.onUploadStart,
                        upload_success_handler: handlers.onUploadSuccess
                    }

                    // Merge the user-defined options with the defaults
                    if (swfUploadOptions) {
                        swfUploadSettings = $.extend(swfUploadSettings, swfUploadOptions);
                    }
                    // Add the user-defined settings to the swfupload object
                    swfUploadSettings = $.extend(swfUploadSettings, settings);

                    // Detect if Flash is available
                    var playerVersion = swfobject.getFlashPlayerVersion();
                    var flashInstalled = (playerVersion.major >= 9);

                    if (flashInstalled) {
                        // Create the swfUpload instance
                        window['uploadify_' + settings.id] = new SWFUpload(swfUploadSettings);
                        var swfuploadify = window['uploadify_' + settings.id];

                        // Add the SWFUpload object to the elements data object
                        $this.data('uploadify', swfuploadify);

                        // Wrap the instance
                        var $wrapper = $('<div />', {
                            'id': settings.id,
                            'class': 'uploadify',
                            'css': {
                                'height': settings.height + 'px',
                                'width': settings.width + 'px'
                            }
                        });
                        $('#' + swfuploadify.movieName).wrap($wrapper);
                        // Recreate the reference to wrapper
                        $wrapper = $('#' + settings.id);
                        // Add the data object to the wrapper
                        $wrapper.data('uploadify', swfuploadify);

                        // Create the button
                        var $button = $('<div />', {
                            'id': settings.id + '-button',
                            'class': 'uploadify-button ' + settings.buttonClass
                        });
                        if (settings.buttonImage) {
                            $button.css({
                                'background-image': "url('" + settings.buttonImage + "')",
                                'text-indent': '-9999px'
                            });
                        }
                        $button.html('<span class="uploadify-button-text">' + settings.buttonText + '</span>')
                            .css({
                                'height': settings.height + 'px',
                                'line-height': settings.height + 'px',
                                'width': settings.width + 'px'
                            });
                        // Append the button to the wrapper
                        $wrapper.append($button);

                        // Adjust the styles of the movie
                        $('#' + swfuploadify.movieName).css({
                            'position': 'absolute',
                            'z-index': 1
                        });


                        // Create the file queue
                        if (!settings.queueID) {
                            var $queue = $('<div />', {
                                'id': settings.id + '-queue',
                                'class': 'uploadify-queue'
                            });
                            $wrapper.after($queue);
                            swfuploadify.settings.queueID = settings.id + '-queue';
                            swfuploadify.settings.defaultQueue = true;
                        }

                        if (settings.helpBlock && !$wrapper.parent().find(".help-block").length) {
                            $wrapper.after('<span class="help-block" for="' + settings.id + '"></span>');
                        }

                        // Create some queue related objects and variables
                        swfuploadify.queueData = {
                            files: {}, // The files in the queue
                            filesSelected: 0, // The number of files selected in the last select operation
                            filesQueued: 0, // The number of files added to the queue in the last select operation
                            filesReplaced: 0, // The number of files replaced in the last select operation
                            filesCancelled: 0, // The number of files that were cancelled instead of replaced
                            filesErrored: 0, // The number of files that caused error in the last select operation
                            uploadsSuccessful: 0, // The number of files that were successfully uploaded
                            uploadsErrored: 0, // The number of files that returned errors during upload
                            averageSpeed: 0, // The average speed of the uploads in KB
                            queueLength: 0, // The number of files in the queue
                            queueSize: 0, // The size in bytes of the entire queue
                            uploadSize: 0, // The size in bytes of the upload queue
                            queueBytesUploaded: 0, // The size in bytes that have been uploaded for the current upload queue
                            uploadQueue: [], // The files currently to be uploaded
                            errorMsg: 'Some files were not added to the queue:'
                        };

                        // Save references to all the objects
                        swfuploadify.original = $clone;
                        swfuploadify.wrapper = $wrapper;
                        swfuploadify.button = $button;
                        swfuploadify.queue = $queue;

                        // Call the user-defined init event handler
                        if (settings.onInit) settings.onInit.call($this, swfuploadify);

                    } else {

                        // Call the fallback function
                        if (settings.onFallback) settings.onFallback.call($this);

                    }
                });

            },

            // Stop a file upload and remove it from the queue
            cancel: function(fileID, supressEvent) {

                var args = arguments;

                this.each(function() {
                    // Create a reference to the jQuery DOM object
                    var $this = $(this),
                        swfuploadify = $this.data('uploadify'),
                        settings = swfuploadify.settings,
                        delay = -1;

                    if (args[0]) {
                        // Clear the queue
                        if (args[0] == '*') {
                            var queueItemCount = swfuploadify.queueData.queueLength;
                            $('#' + settings.queueID).find('.uploadify-queue-item').each(function() {
                                delay++;
                                if (args[1] === true) {
                                    swfuploadify.cancelUpload($(this).attr('id'), false);
                                } else {
                                    swfuploadify.cancelUpload($(this).attr('id'));
                                }
                                $(this).find('.data').removeClass('data').html(' - ' + locale.cancelled);
                                $(this).find('.uploadify-progress-bar').addClass("error");
                                $(this).delay(1000 + 100 * delay).fadeOut(500, function() {
                                    $(this).remove();
                                });
                            });
                            swfuploadify.queueData.queueSize = 0;
                            swfuploadify.queueData.queueLength = 0;
                            // Trigger the onClearQueue event
                            if (settings.onClearQueue) settings.onClearQueue.call($this, queueItemCount);
                        } else {
                            for (var n = 0; n < args.length; n++) {
                                swfuploadify.cancelUpload(args[n]);
                                $('#' + args[n]).find('.data').removeClass('data').html(' - ' + locale.cancelled);
                                $('#' + args[n]).find('.uploadify-progress-bar').addClass("error");
                                $('#' + args[n]).delay(1000 + 100 * n).fadeOut(500, function() {
                                    $(this).remove();
                                });
                            }
                        }
                    } else {
                        var item = $('#' + settings.queueID).find('.uploadify-queue-item').get(0);
                        $item = $(item);
                        swfuploadify.cancelUpload($item.attr('id'));
                        $item.find('.data').removeClass('data').html(' - ' + locale.cancelled);
                        $item.find('.uploadify-progress-bar').remove();
                        $item.delay(1000).fadeOut(500, function() {
                            $(this).remove();
                        });
                    }

                    if ($.isFunction(settings.onRemove)) {
                        settings.onRemove.call($this, swfuploadify.queueData.files[fileID]);
                    }

                    delete swfuploadify.queueData.files[fileID];
                });




            },

            // Revert the DOM object back to its original state
            destroy: function() {

                this.each(function() {
                    // Create a reference to the jQuery DOM object
                    var $this = $(this),
                        swfuploadify = $this.data('uploadify'),
                        settings = swfuploadify.settings;

                    // Destroy the SWF object and
                    swfuploadify.destroy();

                    // Destroy the queue
                    if (settings.defaultQueue) {
                        $('#' + settings.queueID).remove();
                    }

                    // Reload the original DOM element
                    $('#' + settings.id).replaceWith(swfuploadify.original);

                    // Call the user-defined event handler
                    if (settings.onDestroy) settings.onDestroy.call(this);

                    delete swfuploadify;
                });

            },

            // Disable the select button
            disable: function(isDisabled) {

                this.each(function() {
                    // Create a reference to the jQuery DOM object
                    var $this = $(this),
                        swfuploadify = $this.data('uploadify'),
                        settings = swfuploadify.settings;

                    // Call the user-defined event handlers
                    if (isDisabled) {
                        swfuploadify.button.addClass('disabled');
                        if (settings.onDisable) settings.onDisable.call(this);
                    } else {
                        swfuploadify.button.removeClass('disabled');
                        if (settings.onEnable) settings.onEnable.call(this);
                    }

                    // Enable/disable the browse button
                    swfuploadify.setButtonDisabled(isDisabled);
                });

            },

            // Get or set the settings data
            settings: function(name, value, resetObjects) {

                var args = arguments;
                var returnValue = value;

                this.each(function() {
                    // Create a reference to the jQuery DOM object
                    var $this = $(this),
                        swfuploadify = $this.data('uploadify'),
                        settings = swfuploadify.settings;

                    if (typeof(args[0]) == 'object') {
                        for (var n in value) {
                            setData(n, value[n]);
                        }
                    }
                    if (args.length === 1) {
                        returnValue = settings[name];
                    } else {
                        switch (name) {
                            case 'uploader':
                                swfuploadify.setUploadURL(value);
                                break;
                            case 'formData':
                                if (!resetObjects) {
                                    value = $.extend(settings.formData, value);
                                }
                                swfuploadify.setPostParams(settings.formData);
                                break;
                            case 'method':
                                if (value == 'get') {
                                    swfuploadify.setUseQueryString(true);
                                } else {
                                    swfuploadify.setUseQueryString(false);
                                }
                                break;
                            case 'fileObjName':
                                swfuploadify.setFilePostName(value);
                                break;
                            case 'fileTypeExts':
                                swfuploadify.setFileTypes(value, settings.fileTypeDesc);
                                break;
                            case 'fileTypeDesc':
                                swfuploadify.setFileTypes(settings.fileTypeExts, value);
                                break;
                            case 'fileSizeLimit':
                                swfuploadify.setFileSizeLimit(value);
                                break;
                            case 'uploadLimit':
                                swfuploadify.setFileUploadLimit(value);
                                break;
                            case 'queueSizeLimit':
                                swfuploadify.setFileQueueLimit(value);
                                break;
                            case 'buttonImage':
                                swfuploadify.button.css('background-image', settingValue);
                                break;
                            case 'buttonCursor':
                                if (value == 'arrow') {
                                    swfuploadify.setButtonCursor(SWFUpload.CURSOR.ARROW);
                                } else {
                                    swfuploadify.setButtonCursor(SWFUpload.CURSOR.HAND);
                                }
                                break;
                            case 'buttonText':
                                $('#' + settings.id + '-button').find('.uploadify-button-text').html(value);
                                break;
                            case 'width':
                                swfuploadify.setButtonDimensions(value, settings.height);
                                break;
                            case 'height':
                                swfuploadify.setButtonDimensions(settings.width, value);
                                break;
                            case 'multi':
                                if (value) {
                                    swfuploadify.setButtonAction(SWFUpload.BUTTON_ACTION.SELECT_FILES);
                                } else {
                                    swfuploadify.setButtonAction(SWFUpload.BUTTON_ACTION.SELECT_FILE);
                                }
                                break;
                        }
                        settings[name] = value;
                    }
                });

                if (args.length === 1) {
                    return returnValue;
                }

            },

            // Stop the current uploads and requeue what is in progress
            stop: function() {

                this.each(function() {
                    // Create a reference to the jQuery DOM object
                    var $this = $(this),
                        swfuploadify = $this.data('uploadify');

                    // Reset the queue information
                    swfuploadify.queueData.averageSpeed = 0;
                    swfuploadify.queueData.uploadSize = 0;
                    swfuploadify.queueData.bytesUploaded = 0;
                    swfuploadify.queueData.uploadQueue = [];

                    swfuploadify.stopUpload();
                });

            },

            // Start uploading files in the queue
            upload: function() {

                var args = arguments;

                this.each(function() {
                    // Create a reference to the jQuery DOM object
                    var $this = $(this),
                        swfuploadify = $this.data('uploadify');

                    // Reset the queue information
                    swfuploadify.queueData.averageSpeed = 0;
                    swfuploadify.queueData.uploadSize = 0;
                    swfuploadify.queueData.bytesUploaded = 0;
                    swfuploadify.queueData.uploadQueue = [];

                    // Upload the files
                    if (args[0]) {
                        if (args[0] == '*') {
                            swfuploadify.queueData.uploadSize = swfuploadify.queueData.queueSize;
                            swfuploadify.queueData.uploadQueue.push('*');
                            swfuploadify.startUpload();
                        } else {
                            for (var n = 0; n < args.length; n++) {
                                swfuploadify.queueData.uploadSize += swfuploadify.queueData.files[args[n]].size;
                                swfuploadify.queueData.uploadQueue.push(args[n]);
                            }
                            swfuploadify.startUpload(swfuploadify.queueData.uploadQueue.shift());
                        }
                    } else {
                        swfuploadify.startUpload();
                    }

                });

            }

        }

        // These functions handle all the events that occur with the file uploader
        var handlers = {

            // Triggered when the file dialog is opened
            onDialogOpen: function() {
                // Load the swfupload settings
                var settings = this.settings;

                // Reset some queue info
                this.queueData.errorMsg = 'Some files were not added to the queue:';
                this.queueData.filesReplaced = 0;
                this.queueData.filesCancelled = 0;

                // Call the user-defined event handler
                if (settings.onDialogOpen) settings.onDialogOpen.call(this);
            },

            // Triggered when the browse dialog is closed
            onDialogClose: function(filesSelected, filesQueued, queueLength) {
                // Load the swfupload settings
                var settings = this.settings;

                // Update the queue information
                this.queueData.filesErrored = filesSelected - filesQueued;
                this.queueData.filesSelected = filesSelected;
                this.queueData.filesQueued = filesQueued - this.queueData.filesCancelled;
                this.queueData.queueLength = queueLength;

                // Run the default event handler
                if ($.inArray('onDialogClose', settings.overrideEvents) < 0) {
                    if (this.queueData.filesErrored > 0) {
                        alert(this.queueData.errorMsg);
                    }
                }

                // Call the user-defined event handler
                if (settings.onDialogClose) settings.onDialogClose.call(this, this.queueData);

                // Upload the files if auto is true
                if (settings.auto) $('#' + settings.id).uploadify('upload', '*');
            },

            // Triggered once for each file added to the queue
            onSelect: function(file) {
                // Load the swfupload settings
                var settings = this.settings;
                var that = this;

                // Check if a file with the same name exists in the queue
                var queuedFile = {};
                for (var n in this.queueData.files) {
                    queuedFile = this.queueData.files[n];
                    if (queuedFile.uploaded != true && queuedFile.name == file.name) {

                        var replaceQueueItem = confirm($p.str.format(locale.update_queue_confirm, file.name));
                        if (!replaceQueueItem) {
                            this.cancelUpload(file.id);
                            this.queueData.filesCancelled++;
                            return false;
                        } else {
                            $('#' + queuedFile.id).remove();
                            this.cancelUpload(queuedFile.id);
                            this.queueData.filesReplaced++;
                            delete this.queueData.files[queuedFile.id];
                        }

                    }
                }

                // Get the size of the file
                var fileSize = Math.round(file.size / 1024);
                var suffix = 'KB';
                if (fileSize > 1000) {
                    fileSize = Math.round(fileSize / 1000);
                    suffix = 'MB';
                }
                var fileSizeParts = fileSize.toString().split('.');
                fileSize = fileSizeParts[0];
                if (fileSizeParts.length > 1) {
                    fileSize += '.' + fileSizeParts[1].substr(0, 2);
                }
                fileSize += suffix;

                // Truncate the filename if it's too long
                var fileName = file.name;
                if (fileName.length > 25) {
                    fileName = fileName.substr(0, 25) + '...';
                }

                // Create the file data object
                itemData = {
                    'fileID': file.id,
                    'instanceID': settings.id,
                    'fileName': fileName,
                    'fileSize': fileSize
                }

                // Create the file item template
                if (settings.itemTemplate == false) {
                    settings.itemTemplate = '<div id="${fileID}" class="uploadify-queue-item">\
                    <div class="uploadify-queue-info" >\
                        <div class="cancel">\
    						<a href="javascript:$(\'#${instanceID}\').uploadify(\'cancel\', \'${fileID}\')"></a>\
    					</div>\
    					<span class="fileName">${fileName} (${fileSize})</span><span class="data"></span>\
                    </div>\
                    <div class="uploadify-progress">\
						<div class="uploadify-progress-bar"><!--Progress Bar--></div>\
					</div>\
				</div>';
                }

                // Run the default event handler
                if ($.inArray('onSelect', settings.overrideEvents) < 0) {

                    // Replace the item data in the template
                    itemHTML = settings.itemTemplate;
                    for (var d in itemData) {
                        itemHTML = itemHTML.replace(new RegExp('\\$\\{' + d + '\\}', 'g'), itemData[d]);
                    }

                    // Add the file item to the queue
                    $('#' + settings.queueID).append(itemHTML);
                }

                this.queueData.queueSize += file.size;
                this.queueData.files[file.id] = file;

                // Call the user-defined event handler
                if (settings.onSelect) settings.onSelect.apply(this, arguments);
                if (settings.onSet) settings.onSet.apply(this, [itemData]);

            },

            // Triggered when a file is not added to the queue
            onSelectError: function(file, errorCode, errorMsg) {
                // Load the swfupload settings
                var settings = this.settings;

                // Run the default event handler
                if ($.inArray('onSelectError', settings.overrideEvents) < 0) {
                    switch (errorCode) {
                        case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:
                            if (settings.queueSizeLimit > errorMsg) {
                                this.queueData.errorMsg += '\nThe number of files selected exceeds the remaining upload limit (' + errorMsg + ').';
                            } else {
                                this.queueData.errorMsg += '\nThe number of files selected exceeds the queue size limit (' + settings.queueSizeLimit + ').';
                            }
                            break;
                        case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
                            this.queueData.errorMsg += '\nThe file "' + file.name + '" exceeds the size limit (' + settings.fileSizeLimit + ').';
                            break;
                        case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
                            this.queueData.errorMsg += '\nThe file "' + file.name + '" is empty.';
                            break;
                        case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
                            this.queueData.errorMsg += '\nThe file "' + file.name + '" is not an accepted file type (' + settings.fileTypeDesc + ').';
                            break;
                    }
                }
                if (errorCode != SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED) {
                    delete this.queueData.files[file.id];
                }

                // Call the user-defined event handler
                if (settings.onSelectError) settings.onSelectError.apply(this, arguments);
            },

            // Triggered when all the files in the queue have been processed
            onQueueComplete: function() {
                if (this.settings.onQueueComplete) this.settings.onQueueComplete.call(this, this.settings.queueData);
            },

            // Triggered when a file upload successfully completes
            onUploadComplete: function(file) {
                // Load the swfupload settings
                var settings = this.settings,
                    swfuploadify = this;

                // Check if all the files have completed uploading
                var stats = this.getStats();
                this.queueData.queueLength = stats.files_queued;
                if (this.queueData.uploadQueue[0] == '*') {
                    if (this.queueData.queueLength > 0) {
                        this.startUpload();
                    } else {
                        this.queueData.uploadQueue = [];

                        // Call the user-defined event handler for queue complete
                        if (settings.onQueueComplete) settings.onQueueComplete.call(this, this.queueData);
                    }
                } else {
                    if (this.queueData.uploadQueue.length > 0) {
                        this.startUpload(this.queueData.uploadQueue.shift());
                    } else {
                        this.queueData.uploadQueue = [];

                        // Call the user-defined event handler for queue complete
                        if (settings.onQueueComplete) settings.onQueueComplete.call(this, this.queueData);
                    }
                }

                // Call the default event handler
                if ($.inArray('onUploadComplete', settings.overrideEvents) < 0) {
                    if (settings.removeCompleted) {
                        switch (file.filestatus) {
                            case SWFUpload.FILE_STATUS.COMPLETE:
                                setTimeout(function() {
                                    if ($('#' + file.id)) {
                                        swfuploadify.queueData.queueSize -= file.size;
                                        swfuploadify.queueData.queueLength -= 1;
                                        delete swfuploadify.queueData.files[file.id]
                                        $('#' + file.id).fadeOut(500, function() {
                                            $(this).remove();
                                        });
                                    }
                                }, settings.removeTimeout * 1000);
                                break;
                            case SWFUpload.FILE_STATUS.ERROR:
                                if (!settings.requeueErrors) {
                                    setTimeout(function() {
                                        if ($('#' + file.id)) {
                                            swfuploadify.queueData.queueSize -= file.size;
                                            swfuploadify.queueData.queueLength -= 1;
                                            delete swfuploadify.queueData.files[file.id];
                                            $('#' + file.id).fadeOut(500, function() {
                                                $(this).remove();
                                            });
                                        }
                                    }, settings.removeTimeout * 1000);
                                }
                                break;
                        }
                    } else {
                        file.uploaded = true;
                    }
                }

                // Call the user-defined event handler
                if (settings.onUploadComplete) settings.onUploadComplete.call(this, file);
            },

            // Triggered when a file upload returns an error
            onUploadError: function(file, errorCode, errorMsg) {
                // Load the swfupload settings
                var settings = this.settings;

                // Set the error string
                var errorString = 'Error';
                switch (errorCode) {
                    case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:
                        errorString = 'HTTP Error (' + errorMsg + ')';
                        break;
                    case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:
                        errorString = 'Missing Upload URL';
                        break;
                    case SWFUpload.UPLOAD_ERROR.IO_ERROR:
                        errorString = 'IO Error';
                        break;
                    case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:
                        errorString = 'Security Error';
                        break;
                    case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
                        alert('The upload limit has been reached (' + errorMsg + ').');
                        errorString = 'Exceeds Upload Limit';
                        break;
                    case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:
                        errorString = 'Failed';
                        break;
                    case SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND:
                        break;
                    case SWFUpload.UPLOAD_ERROR.FILE_VALIDATION_FAILED:
                        errorString = 'Validation Error';
                        break;
                    case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:
                        errorString = 'Cancelled';
                        this.queueData.queueSize -= file.size;
                        this.queueData.queueLength -= 1;
                        if (file.status == SWFUpload.FILE_STATUS.IN_PROGRESS || $.inArray(file.id, this.queueData.uploadQueue) >= 0) {
                            this.queueData.uploadSize -= file.size;
                        }
                        // Trigger the onCancel event
                        if (settings.onCancel) {
                            settings.onCancel.call(this, file);
                        }

                        delete this.queueData.files[file.id];
                        break;
                    case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:
                        errorString = 'Stopped';
                        break;
                }

                // Call the default event handler
                if ($.inArray('onUploadError', settings.overrideEvents) < 0) {

                    if (errorCode != SWFUpload.UPLOAD_ERROR.FILE_CANCELLED && errorCode != SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED) {
                        $('#' + file.id).addClass('uploadify-error');
                    }

                    // Reset the progress bar
                    $('#' + file.id).find('.uploadify-progress-bar').css('width', '1px');

                    // Add the error message to the queue item
                    if (errorCode != SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND && file.status != SWFUpload.FILE_STATUS.COMPLETE) {
                        $('#' + file.id).find('.data').html(' - ' + errorString);
                    }
                }

                var stats = this.getStats();
                this.queueData.uploadsErrored = stats.upload_errors;

                // Call the user-defined event handler
                if (settings.onUploadError) settings.onUploadError.call(this, file, errorCode, errorMsg, errorString);
            },

            // Triggered periodically during a file upload
            onUploadProgress: function(file, fileBytesLoaded, fileTotalBytes) {
                // Load the swfupload settings
                var settings = this.settings;

                // Setup all the variables
                var timer = new Date();
                var newTime = timer.getTime();
                var lapsedTime = newTime - this.timer;
                if (lapsedTime > 500) {
                    this.timer = newTime;
                }
                var lapsedBytes = fileBytesLoaded - this.bytesLoaded;
                this.bytesLoaded = fileBytesLoaded;
                var queueBytesLoaded = this.queueData.queueBytesUploaded + fileBytesLoaded;
                var percentage = Math.round(fileBytesLoaded / fileTotalBytes * 100);

                // Calculate the average speed
                var suffix = 'KB/s';
                var mbs = 0;
                var kbs = (lapsedBytes / 1024) / (lapsedTime / 1000);
                kbs = Math.floor(kbs * 10) / 10;
                if (this.queueData.averageSpeed > 0) {
                    this.queueData.averageSpeed = Math.floor((this.queueData.averageSpeed + kbs) / 2);
                } else {
                    this.queueData.averageSpeed = Math.floor(kbs);
                }
                if (kbs > 1000) {
                    mbs = (kbs * .001);
                    this.queueData.averageSpeed = Math.floor(mbs);
                    suffix = 'MB/s';
                }

                // Call the default event handler
                if ($.inArray('onUploadProgress', settings.overrideEvents) < 0) {
                    if (settings.progressData == 'percentage') {
                        $('#' + file.id).find('.data').html(' - ' + percentage + '%');
                    } else if (settings.progressData == 'speed' && lapsedTime > 500) {
                        $('#' + file.id).find('.data').html(' - ' + this.queueData.averageSpeed + suffix);
                    }
                    $('#' + file.id).find('.uploadify-progress-bar').css('width', percentage + '%');
                }

                // Call the user-defined event handler
                if (settings.onUploadProgress) settings.onUploadProgress.call(this, file, fileBytesLoaded, fileTotalBytes, queueBytesLoaded, this.queueData.uploadSize);
            },

            // Triggered right before a file is uploaded
            onUploadStart: function(file) {
                // Load the swfupload settings
                var settings = this.settings;

                var timer = new Date();
                this.timer = timer.getTime();
                this.bytesLoaded = 0;
                if (this.queueData.uploadQueue.length == 0) {
                    this.queueData.uploadSize = file.size;
                }
                if (settings.checkExisting) {
                    $.ajax({
                        type: 'POST',
                        async: false,
                        url: settings.checkExisting,
                        data: {
                            filename: file.name
                        },
                        success: function(data) {
                            if (data == 1) {
                                var overwrite = confirm('A file with the name "' + file.name + '" already exists on the server.\nWould you like to replace the existing file?');
                                if (!overwrite) {
                                    this.cancelUpload(file.id);
                                    $('#' + file.id).remove();
                                    if (this.queueData.uploadQueue.length > 0 && this.queueData.queueLength > 0) {
                                        if (this.queueData.uploadQueue[0] == '*') {
                                            this.startUpload();
                                        } else {
                                            this.startUpload(this.queueData.uploadQueue.shift());
                                        }
                                    }
                                }
                            }
                        }
                    });
                }

                // Call the user-defined event handler
                if (settings.onUploadStart) settings.onUploadStart.call(this, file);
            },

            // Triggered when a file upload returns a successful code
            onUploadSuccess: function(file, data, response) {
                // Load the swfupload settings
                var settings = this.settings;
                var stats = this.getStats();
                this.queueData.uploadsSuccessful = stats.successful_uploads;
                this.queueData.queueBytesUploaded += file.size;

                // Call the default event handler
                if ($.inArray('onUploadSuccess', settings.overrideEvents) < 0) {
                    $('#' + file.id).find('.data').html(' - ' + locale.complete);
                    $('#' + file.id).addClass("completed");
                    $('#' + file.id).data("stats", stats);
                }

                //上传完成以后把进度更新为100%
                $('#' + file.id).find('.uploadify-progress-bar').css('width', '100%');

                // Call the user-defined event handler
                if (settings.onUploadSuccess) settings.onUploadSuccess.call(this, file, data, response);
            }

        }

        $.fn.uploadify = function(method) {

            if (methods[method]) {
                return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
            } else if (typeof method === 'object' || !method) {
                return methods.init.apply(this, arguments);
            } else {
                $.error('The method ' + method + ' does not exist in $.uploadify');
            }

        }
        window.SWFUpload = SWFUpload;

    })($);

});
